`include "common_define.vh"

module epu_tx_process(
    input epu_clk,
    input rst_n,
    input [2:0] cdc_counter,
    input [23:0] shift_reg,
    input [10:0] len_counter,
    input state_change,
    input [3:0] state,
    input [15:0] ecat_event_mask_r,
    input [15:0] ecat_event_request_r,
    output reg epu_tx_clk,
    output reg [7:0] epu_tx_dout
);
    // tx clock 
    always@(posedge epu_clk or negedge rst_n)begin
        if(!rst_n) begin
            epu_tx_clk <= 1'b0;
        end
        else if(cdc_counter == 7) begin
            epu_tx_clk <= 1'b1;
        end
        else if(cdc_counter ==3) begin
            epu_tx_clk <= 1'b0;
        end
    end
    // tx data
    always@(posedge epu_clk or negedge rst_n)begin
        if(!rst_n) begin
            epu_tx_dout <= 8'b0;
        end 
        else if(cdc_counter==7) begin
            case(state)
                `IDLE: begin
                    epu_tx_dout <= shift_reg[15:8];
                end
                `PREAMBLE: begin
                    epu_tx_dout <= shift_reg[15:8];
                end
                `ETHERNET_HEADER: begin
                    if(len_counter==6) begin
                        epu_tx_dout <= shift_reg[15:8] | 8'h02;
                    end
                    else begin
                        epu_tx_dout <= shift_reg[15:8];
                    end
                end
                `VLAN: begin
                    epu_tx_dout <= shift_reg[15:8];
                end
                `IP_UDP: begin
                    if(len_counter==7 || len_counter==8) begin
                        epu_tx_dout <= 8'h00; // crc
                    end
                    else begin
                        epu_tx_dout <= shift_reg[15:8];
                    end
                end
                `ETHERCAT_HEADER: begin
                    epu_tx_dout <= shift_reg[15:8];
                end
                `DATAGRAM_HEADER: begin
                    if(len_counter==10) begin
                        epu_tx_dout <= shift_reg[15:0] | (ecat_event_mask_r & ecat_event_request_r);
                    end
                    else begin
                        epu_tx_dout <= shift_reg[15:8];
                    end
                end
            endcase
        end
    end
endmodule